import { Node } from './Node'
    export class CommonUtils {
        /**
         * 判断参数是否是 Node 对象
         * @param node Node 类的对象
         */
        static isNode(node: Node | string) {
            return !!node && node instanceof Node
        }

        /**
         * 获得一个 uuid
         */
        static getUUID(): string {
            return (new Date().getTime().toString(16) + Math.random().toString(16).substr(2)).substr(2, 16)
        }

        /**
         * 判断一个字符串去掉空格后是否是空值
         */
        static isEmpty (s: string) {
            if (!s) return true
            return s.replace(/\s*/, '').length == 0
        }
    }

    export class DomUtils {
        /**
         * 添加事件
         * @param target 事件源 
         * @param eventName 事件名称
         * @param cb 回调函数
         */
        static addEvent(target: HTMLElement | Document, eventName: string, cb:any) {
            target.addEventListener(eventName, cb, false)
        }

        /**
         * 根据 id 查找元素
         * @param id 
         */
        static $g (id: string) {
            return document.getElementById(id);
        }
        
        /**
         * 根据 tag 创建 DOM 元素
         * @param tag 
         */
        static $c (tag: string) {
            return document.createElement(tag);
        }

        /**
         * 将 node 的第一个子节点替换为 t
         * @param node 
         * @param t 
         */
        static $t (node: HTMLElement, t: any) {
            if(node.hasChildNodes()){
                node.firstChild.nodeValue = t;
            }else{
                node.appendChild(document.createTextNode(t));
            }
        }
        /**
         * 将 node 的所有子节点替换为 t
         * @param node 
         * @param t 
         */
        static $h (node: HTMLElement, t: any) {
            node.innerHTML = t
        }

        /**
         * 判断 el 是否为 标签元素
         * @param el 
         */
        static $i (el) {
            return !!el&&(typeof el==='object')&&(el.nodeType===1)&&(typeof el.style==='object')&&(typeof el.ownerDocument==='object');
        }

    }

    export class CanvasUtils {
        /**
         * 画 bezier 曲线
         * @param ctx Canvas 的上下文对象
         * @param x1 
         * @param y1 
         * @param x2 
         * @param y2 
         */
        static bezierto(ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number) {
            ctx.beginPath()
            ctx.moveTo(x1, y1)
            ctx.bezierCurveTo(x1+(x2-x1)*2/3,y1,x1,y2,x2,y2);
            ctx.stroke();
        }

        /**
         * 画直线
         * @param ctx Canvas 的上下文对象 
         * @param x1 
         * @param y1 
         * @param x2 
         * @param y2 
         */
        static lineto(ctx: CanvasRenderingContext2D, x1: number, y1: number, x2: number, y2: number) {
            ctx.beginPath();
            ctx.moveTo(x1,y1);
            ctx.lineTo(x2,y2);
            ctx.stroke();
        }

        /**
         * 清空内容
         * @param ctx Canvas 的上下文对象 
         * @param x 起始坐标 X
         * @param y 起始坐标 Y
         * @param w 宽
         * @param h 高
         */
        static clear(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number) {
            ctx.clearRect(x, y, w, h)
        }
    }

    export class JsonUtils {
        /**
         * 将 JSON 转换为 字符串
         * @param json 
         */
        static json2string (json: any): string | null {
            if(!!JSON){
                try{
                    var json_str = JSON.stringify(json);
                    return json_str;
                }catch(e){
                    console.warn(e);
                    console.warn('can not convert to string');
                    return null;
                }
            }
        }

        /**
         * 将 string 转换为 JSON 对象
         * @param str
         */
        static string2json (str: string): any {
            if(!!JSON){
                try{
                    var json = JSON.parse(str);
                    return json;
                }catch(e){
                    console.warn(e);
                    console.warn('can not parse to json');
                    return null;
                }
            }
        }

        /**
         * 将 from 的字段转移到 target，如果 target 有，则覆盖
         * @param target 目标对象
         * @param from 源对象
         */
        static merge (target: any, from: any) {
            for(let o in from){
                if(o in target){ // 如果 target 有这个字段则覆盖
                    if(typeof target[o] === 'object' &&
                        Object.prototype.toString.call(target[o]).toLowerCase() == '[object object]' &&
                        !target[o].length){ // 如果 target[o] 是一个对象，则递归调用
                        this.merge(target[o], from[o]);
                    }else{
                        target[o] = from[o];
                    }from
                }else{// 如果 target 没有这个字段，则添加
                    target[o] = from[o];
                }
            }
            return target;
        }


    }

    export class FileUtil {

    }
    export class AjaxUtil {

    }

